﻿<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
    <script runat="server">
        
        // Definición de 'constantes'.
        // Se define cadena 'vacía'.
        String str_empty                    = "";
        String str_cero                     = "0";
        String str_tilde                    = "~";
        String strconst_diag                = "/";
        String strconst_pagdefaultdiag      = "/Default.aspx";

        string mysql_ConnectionString       = ConfigurationManager.ConnectionStrings["DGPLADES_BudConnectionString"].ConnectionString;
        
        String str_nombpaganterior;
        
        String str_entrada;

        // TODO. Cambiar hacia Módulo Administrativo, cuando se implemente.
        //String str_Nombre = "Jose Luis";
        //String str_Apellidos = "Buendia Reyes";
        //String str_mail = "soporte@xube.com.mx";
        //String str_Nombre = "Mariana";
        //String str_Apellidos = "Colmenares Santos";
        //String str_mail = "proyecto@xube.com.mx";

        int int_ultindice = 0;

        //// TODO. Cambiar hacia Módulo Administrativo, cuando se implemente.
        //int int_idGrupos                    = 1;
    
        protected override void OnLoad(EventArgs e)
        {
            // Se coloca modo de texto 'Password', para el campo de la Contraseña.
            TextBox_Contrasenia.TextMode = TextBoxMode.Password;
            
            if (Session.Contents["ses_bl_entrada"] == null)
            {
                str_entrada                 = str_cero;
            }
            else
            {
                str_entrada                 = Session.Contents["ses_bl_entrada"].ToString();
            }
            
            if (str_entrada.Equals(str_cero))
            {
                //Session.Contents["ses_intnivel"] = 0;
                // Se 'carga' la página solicitada.
                base.OnLoad(e);
              }
            else
            {
                if (Int16.Parse(Session.Contents["ses_intnivel"].ToString()) > 0)
                    // Se 'carga' la página solicitada.
                    base.OnLoad(e);
                else
                {
                    Session.Contents.Add("ses_intnivel", 1);
                    // Se 'carga' la página siguiente.
                    Response.Redirect("~/App_Codigo/Mod_MenuPpal/DGPLADES_MenuPpal.aspx", false);
                }
            }            
         } // protected override void OnLoad(EventArgs e).

        protected void ButtonEntrada_Click(object sender, EventArgs e)
        {
            String str_Usuario              = this.TextBox_Usuario.Text;
            String str_Contrasenia          = this.TextBox_Contrasenia.Text;

            //String str_ContraseniaHash;

            bool bl_resultadovalidanulo      = false;
            bool bl_resultadovalidacion     = false;

            try
            {
                // TODO. Cambiar hacia Módulo Administrativo, cuando se implemente.
            //    // Se raliza la inserción de Usuario.
            //    // Se genera número aleatorio encriptado.
            //    String str_Salt = CreaNumeroAleatorioEncriptado(5);

            //    // TODO. Cambiar hacia Módulo Administrativo, cuando se implemente.
            //    // Se genera Contraseña 'hash' (encriptada).
            //    str_ContraseniaHash = CreaContraseniaHash(str_Contrasenia, str_Salt);

            //    // TODO. Cambiar hacia Módulo Administrativo, cuando se implemente.
            //    bl_resultadoinsercion = InsertaUsuarioGrupo(str_Usuario, str_ContraseniaHash, str_Nombre,
            //        str_Apellidos, str_mail, int_idGrupos);

            if (str_Usuario == null ||
                str_Usuario.Equals(str_empty) ||
                str_Contrasenia == null ||
                str_Contrasenia.Equals(str_empty))
            {
                bl_resultadovalidanulo = false;

                // Se 'crea' o se actualiza la bandera de entrada, como variable de sesión.
                if (Session.Contents["ses_bl_entrada"] == null)
                    Session.Contents.Add("ses_bl_entrada", "0");
                else
                    Session.Contents["ses_bl_entrada"] = "0";

                lblMensajeEntrada.Text = "Usuario y/o Contraseña vacío(s), \n\r favor de proporcionar datos de Usuario. ";
            }
            else
            {
                // Se 'crea' o se actualiza la bandera de entrada, como variable de sesión.
                if (Session.Contents["ses_bl_entrada"] == null)
                    Session.Contents.Add("ses_bl_entrada", "1");
                else
                    Session.Contents["ses_bl_entrada"] = "1";

                bl_resultadovalidanulo = true;
            }
            
            if (bl_resultadovalidanulo)
            {
                // Se realiza la validación del Usuario y Password.
                bl_resultadovalidacion = ValidaUsuarioContrasenia(this.TextBox_Usuario.Text, this.TextBox_Contrasenia.Text);
                if (bl_resultadovalidacion)
                {
                    this.lblMensajeEntrada.Text = "Los datos del Usuario son correctos...";

                    // Se 'crea' o se actualiza la bandera de entrada, como variable de sesión.
                    if (Session.Contents["ses_bl_entrada" ] == null)
                        Session.Contents.Add("ses_bl_entrada", "1");
                    else
                        Session.Contents["ses_bl_entrada"] = "1";

                    Response.Redirect("~/App_Codigo/Mod_MenuPpal/DGPLADES_MenuPpal.aspx", false);
                }
                else
                {
                    // Se actualiza la bandera de entrada.
                    Session.Contents["ses_bl_entrada"] = "0";
                    this.lblMensajeEntrada.Text = "Los datos del Usuario son incorrectos...";
                }
            }
            }
            catch (Exception ex)
            {
                Session.Contents["ses_bl_entrada"] = "0";
                this.lblMensajeEntrada.Text = " Error al validar datos (" + ex.Message + ")";
            }
         }

        // Se obtiene, en base al Npmbre de Usuario, el código y la Contraseña 'hash' (encriptada)
        // desde la Base de DAtos.
        protected bool ValidaUsuarioContrasenia(String str_Usu, String str_Contra)
        {
            System.Data.Odbc.OdbcConnection mysqlconn_Conexion = new System.Data.Odbc.OdbcConnection(mysql_ConnectionString);
            
            System.Data.Odbc.OdbcDataReader mysqldr_Verificacion = null;
            
            bool bl_ValidaUsuContrasenia = false;
            
            System.Data.Odbc.OdbcCommand mysqlcmd_Verificacion = new System.Data.Odbc.OdbcCommand("SELECT Password FROM Usuarios " +
                "WHERE Username = ?", mysqlconn_Conexion);
            
            try
            {
              System.Data.Odbc.OdbcParameter mysqlparam_Usu = mysqlcmd_Verificacion.Parameters.Add("@str_Username", System.Data.Odbc.OdbcType.VarChar, 100);
                
              mysqlparam_Usu.Value = str_Usu;
                
              mysqlconn_Conexion.Open();

              mysqldr_Verificacion          = mysqlcmd_Verificacion.ExecuteReader();
                   
              // Se obtiene el único 'renglón', es decir, la Contraseña 'hash' ('encriptada').
              mysqldr_Verificacion.Read();
            
              Object arr_new = mysqldr_Verificacion.GetValue(0);
                
              String str_ContraseniaHash    = mysqldr_Verificacion.GetString(0);
                 
               String str_codigo             = str_ContraseniaHash.Substring(str_ContraseniaHash.Length - 5);
                                    
              // Ahora, se toma la Contraseña proporcionada por el Usuario
              //        y se genera su 'hash' (Contraseña encriptada).
              //String str_NuevaContraseniaHash= CreaContraseniaHash(str_Contra, str_codigo);
              String str_NuevaContraseniaHash = CreaContraseniaHash(str_Contra, str_codigo);

              // Se verifican las Contraseñas 'hash' (encriptadas).
              bl_ValidaUsuContrasenia = str_NuevaContraseniaHash.Equals(str_ContraseniaHash);
            }
            catch (Exception ex)
            {
                throw new Exception("Error al validar datos de Usuario. " + ex.Message);
            }
            finally
            {
                mysqlconn_Conexion.Close();
            }
            return bl_ValidaUsuContrasenia;
        
         } // protected bool ValidaUsuarioContrasenia(String str_Usu, String str_Contra).
        
         // TODO. Cambiar hacia Módulo Administrativo, cuando se implemente.
        // Se realiza la inserción de Usuario, incluído(s) su(s) grupo(s).
          private bool InsertaUsuarioGrupo(String str_Usu, String str_ContraseniaH, String str_Nomb,
              String str_Apell, String str_ml, int int_idGrup)
        {
            System.Data.Odbc.OdbcConnection mysqlconn_Conexion = new System.Data.Odbc.OdbcConnection(mysql_ConnectionString);
            
            bool bl_resultadoI = false;

            System.Data.Odbc.OdbcCommand mysqlcmd_Insercion = new System.Data.Odbc.OdbcCommand("INSERT INTO " +
                "usuarios (Username, Password, Nombre, Apellidos, " +
                "mail) VALUES (?, ?, ?, ?, ?)", mysqlconn_Conexion);              
            try
            {                
                mysqlconn_Conexion.Open();
                
                mysqlcmd_Insercion.Parameters.Add("str_Username", System.Data.Odbc.OdbcType.VarChar).Value = str_Usu;
                mysqlcmd_Insercion.Parameters.Add("str_Password", System.Data.Odbc.OdbcType.VarChar).Value = str_ContraseniaH;
                mysqlcmd_Insercion.Parameters.Add("str_Nombre", System.Data.Odbc.OdbcType.VarChar).Value = str_Nomb;
                mysqlcmd_Insercion.Parameters.Add("str_Apellidos", System.Data.Odbc.OdbcType.VarChar).Value = str_Apell;
                mysqlcmd_Insercion.Parameters.Add("str_mail", System.Data.Odbc.OdbcType.VarChar).Value = str_ml;

                // Se actualiza tabla de Grupos.
                int queryResult = mysqlcmd_Insercion.ExecuteNonQuery();

                mysqlconn_Conexion.Close();

                if (queryResult == 1)
                {
                    Session.Contents.Add("ses_Usuario", this.TextBox_Usuario.Text);
                    Session.Contents.Add("ses_Contrasenia", this.TextBox_Contrasenia.Text);

                    Session.Contents.Add("ses_intnivel", 1);

                    lblMensajeEntrada.Text = "Los datos del Usuario y Grupo(s) se almacenaron correctamente...";
                    bl_resultadoI           = true;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error al verificar datos de Usuario. " + ex.Message);
            }
            finally
            {
              mysqlconn_Conexion.Close();
            }

            return bl_resultadoI;
        } // private bool InsertaUsuarioGrupo(String str_Usu, String str_ContraseniaH, String str_Nomb,
          //    String str_Apell, String str_ml, int int_idGrup)
        
        private static string CreaNumeroAleatorioEncriptado(int int_tamanio)
        {
            // Se genera un número aleatorio encriptado, utilizando
            //    el proveedor de servicio de encriptamiento (cryptographic
            // service provider).
            System.Security.Cryptography.RNGCryptoServiceProvider numaleaencript = new System.Security.Cryptography.RNGCryptoServiceProvider();
            byte[] byte_almacenador         = new byte[int_tamanio];
            numaleaencript.GetBytes(byte_almacenador);

            // Devuelve una representación tipo cadena base 64, del número aleatorio.
            String str_aux = Convert.ToBase64String(byte_almacenador);
            return str_aux.Substring(3,5);
        }

        /// <summary>
        /// 'Calcula' un resumen criptográfico aleatorizado de la contraseña (password) 
        /// y de la cadena aleatoria proporcionada ('salt', creada en base al nombre
        /// del Usuario). Devuelve una cadena, base 64, 'codificada'.
        /// </summary>
        /// <param name="password">La contraseña a 'codificar'.</param>
        /// <param name="salt">cadena aleatoria a utilizar en la 'codificación'.</param>
        private String CreaContraseniaHash(string pwd, string salt)
        {
            String saltAndPwd = String.Concat(pwd, salt);
            String hashedPwd                    = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPwd, "SHA1");
            hashedPwd                           = String.Concat(hashedPwd, salt);
            return hashedPwd;
        }        
    </script>
    <style type="text/css">
    .style3
    {
        width: 89%;
    }
    .style4
    {
        width: 53%;
    }
</style>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <table style="width:80%;">
        <tr>
            <td class="style4">
            <h2>
                <asp:Label ID="lblentrar" runat="server" Text="Entrar al Sistema"></asp:Label>
            </h2>
            </td>
            <td class="style2">
               &nbsp;</td>
            <td class="style3">
                &nbsp;</td>
            <td>
                &nbsp;</td>
        </tr>
        <tr>
            <td class="style4">
              &nbsp;
            </td>
            <td colspan = "2" class="style2">
               <img alt="" src="Img/Mod_Login/ImgDoctores.jpg" />
            </td>
            <td class="style3">
                &nbsp;</td>
            <td>
                &nbsp;</td>
        </tr>
        <tr>
            <td class="style4">
                &nbsp;</td>
            <td class="style2">
                Usuario</td>
            <td class="style3">
                <asp:TextBox ID="TextBox_Usuario" runat="server"></asp:TextBox>
            </td>
            <td>
                &nbsp;</td>
        </tr>
        <tr>
            <td class="style4">
                &nbsp;</td>
            <td class="style2">
                &nbsp;</td>
            <td class="style3">
                &nbsp;</td>
            <td>
                &nbsp;</td>
        </tr>
        <tr>
            <td class="style4">
                &nbsp;</td>
            <td class="style2">
               Contraseña</td>
            <td class="style3">
                <asp:TextBox ID="TextBox_Contrasenia" runat="server"></asp:TextBox>
            </td>
            <td>
                &nbsp;</td>
        </tr>
        <tr>
            <td class="style4">
                &nbsp;</td>
            <td class="style2">
                &nbsp;</td>
            <td class="style3">
                &nbsp;</td>
            <td>
                &nbsp;</td>
        </tr>
        <tr>
            <td class="style4">
                &nbsp;</td>
            <td class="style2">
                &nbsp;</td>
            <td class="style3">            
                <asp:Button ID="ButtonEntrada" runat="server" Text="Entrar"
                 onclick="ButtonEntrada_Click" /> 
            </td>
            <td>
                &nbsp;</td>
        </tr>
        <tr>
            <td class="style4">
                &nbsp;</td>
            <td class="style2">
                &nbsp;</td>
            <td class="style3">
                <asp:Label ID="lblMensajeEntrada" runat="server" Text=""></asp:Label>
            </td>
            <td>
                &nbsp;</td>
        </tr>
    </table>
</asp:Content>
